package com.cg.leetcode;

import org.junit.Test;

import java.util.Arrays;

/**
 * 59.螺旋矩阵 II
 *
 * @author cg
 * @program LeetCode->LeetCode_59
 * @create 2022-07-08 14:16
 **/
public class LeetCode_59 {

    @Test
    public void test59() {
        System.out.println(Arrays.deepToString(generateMatrix(2)));
        System.out.println(Arrays.deepToString(generateMatrix(3)));
        System.out.println(Arrays.deepToString(generateMatrix(4)));
    }

    /**
     * 给你一个正整数 n ，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
     * <p>
     * 示例 1：
     * 输入：n = 3
     * 输出：[[1,2,3],[8,9,4],[7,6,5]]
     * <p>
     * 示例 2：
     * 输入：n = 1
     * 输出：[[1]]
     * <p>
     * 提示：
     * 1 <= n <= 20
     *
     * @param n
     * @return
     */
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        // 控制循环次数
        int loop = 0;
        // 每次循环的开始点(start, start)
        int start = 0;
        // 定义填充数字
        int count = 1;
        int i, j;
        while (loop < n / 2) {
            loop++;
            // 上侧从左至右
            for (j = start; j < n - loop; j++) {
                res[start][j] = count++;
            }
            // 右侧从上至下
            for (i = start; i < n - loop; i++) {
                res[i][j] = count++;
            }
            // 下侧从右至左
            for (; j > start; j--) {
                res[i][j] = count++;
            }
            // 左侧从下至上
            for (; i > start; i--) {
                res[i][j] = count++;
            }
            start++;
        }
        // 如果n为奇数的话，需要单独给矩阵最中间的位置赋值
        if (n % 2 == 1) {
            res[start][start] = count;
        }
        return res;
    }

}
